﻿#region copyright
//Copyright (c) 2011, Check In Solutions LLC
//All rights reserved.

//Redistribution and use in source and binary forms, with or without
//modification, are permitted provided that the following conditions are met:
//    * Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//    * Neither the name of the Check In Solutions LLC nor the
//      names of its contributors may be used to endorse or promote products
//      derived from this software without specific prior written permission.

//THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
//WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
//DISCLAIMED. IN NO EVENT SHALL CHECK IN SOLUTIONS LLC BE LIABLE FOR ANY
//DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
//(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
//LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
//ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
//(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
//SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#endregion
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CheckInSolutions.Messaging
{
    public delegate void ChangedMessageXMLHandler();
    public delegate void ChangedPayloadBytesHandler();

    public class QMessage : ICloneable
    {
        #region Constructors
        public QMessage()
        {
        }
        #endregion

        #region Enums
        public enum MessageTypes
        {
            Unknown,
            Test
        }
        #endregion

        #region Properties
        protected string m_MessageXml;
        protected byte[] m_PayloadBytes;
        protected string m_CryptoName;
        protected MessageTypes m_MessageType = MessageTypes.Unknown;

        public MessageTypes MessageType
        {
            get { return this.m_MessageType; }
            set { this.m_MessageType = value; }
        }

        public string CryptoName
        {
            get { return this.m_CryptoName; }
            set { this.m_CryptoName = value; }
        }

        /// <summary>
        /// used in object serialization by handling transports.
        /// </summary>
        public string MessageXML
        {
            get { return this.m_MessageXml;  }
            set 
            { 
                this.m_MessageXml = value;
                if (this.ChangedMessageXML is ChangedMessageXMLHandler)
                    this.ChangedMessageXML();
            }
        }

        /// <summary>
        /// used in object serialization by handling transports.
        /// </summary>
        public byte[] PayloadBytes
        {
            get { return this.m_PayloadBytes; }
            set 
            { 
                this.m_PayloadBytes = value;
                if (this.ChangedPayloadBytes is ChangedPayloadBytesHandler) 
                    this.ChangedPayloadBytes();
            }
        }
        #endregion

        #region Methods
        public void CopyFromQMessage(QMessage qMessage)
        {
            this.MessageXML = qMessage.MessageXML;
            this.PayloadBytes = qMessage.PayloadBytes;
            this.MessageType = qMessage.MessageType;
            if (String.IsNullOrEmpty(this.CryptoName))
                this.CryptoName = qMessage.CryptoName;
            else
                if (!this.CryptoName.Equals(qMessage.CryptoName))
                    throw new ArgumentException(String.Format("QMessage.copyFromQMessage has different Crypto names set, current is({0}) and the CopyFrom is({1}).",this.CryptoName, qMessage.CryptoName));
        }
        #endregion

        #region Events
        protected event ChangedMessageXMLHandler ChangedMessageXML;
        protected event ChangedPayloadBytesHandler ChangedPayloadBytes;
        #endregion
 
        #region Interface Implementations
        public object Clone()
        {
            QMessage returnValue = new QMessage();
            returnValue.CopyFromQMessage(this);
            return returnValue;
        }
        #endregion


    }
}
